package handlers

import (
	"net/http"
	"qimo_work/models"
	"qimo_work/repositories"
	"qimo_work/utils"
	"strconv"

	"github.com/gin-gonic/gin"
)

func CreatePost(c *gin.Context) {
	var post models.Post

	// 解析 JSON 数据
	if err := c.ShouldBindJSON(&post); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	// 获取 token
	token := c.GetHeader("Authorization")
	if token == "" {
		c.JSON(http.StatusUnauthorized, gin.H{"error": "Authorization token is missing"})
		return
	}

	// 验证 token 获取用户信息
	claims, err := utils.ValidateJWT(token)
	if err != nil {
		c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid or expired token"})
		return
	}

	// 绑定用户ID
	post.UserID = uint(claims.UserID)

	// 保存文章到数据库
	if err := repositories.CreatePost(&post); err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "发布文章失败", "details": err.Error()})
		return
	}

	// 获取文章的 ID
	postID := post.ID

	// 将临时存储的附件信息存入数据库，并绑定 postid
	if err := SaveAttachmentsToDB(token, postID); err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "保存附件信息失败", "details": err.Error()})
		return
	}

	// 返回成功响应
	c.JSON(http.StatusOK, gin.H{"message": "文章发布成功", "post_id": postID})
}

// GetAllPosts 获取所有文章，支持分页
func GetAllPosts(c *gin.Context) {
	// 获取分页参数，默认为第 1 页，每页 10 条数据
	page, err := strconv.Atoi(c.DefaultQuery("page", "1"))
	if err != nil || page < 1 {
		page = 1
	}

	pageSize, err := strconv.Atoi(c.DefaultQuery("pageSize", "5"))
	if err != nil || pageSize < 1 {
		pageSize = 5
	}

	// 调用 repository 获取分页数据
	posts, total, err := repositories.GetAllPosts(page, pageSize)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "获取文章失败", "details": err.Error()})
		return
	}

	// 返回分页数据
	c.JSON(http.StatusOK, gin.H{
		"data":     posts,
		"total":    total,
		"page":     page,
		"pageSize": pageSize,
	})
}

// GetPostsByCategory 根据分类 ID 获取前 5 条文章
func GetPostsByCategory(c *gin.Context) {
	// 获取分类 ID
	categoryID, err := strconv.Atoi(c.Param("category_id"))
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "无效的分类 ID"})
		return
	}

	// 调用 repository 获取该分类下的前 5 条文章
	posts, err := repositories.GetPostsByCategory(categoryID, 5)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "获取文章失败", "details": err.Error()})
		return
	}

	// 返回文章数据
	c.JSON(http.StatusOK, gin.H{"data": posts})
}

// GetPostsByCategoryall 获取分类下的所有文章
func GetPostsByCategoryall(c *gin.Context) {
	// 获取分类 ID
	categoryID, err := strconv.Atoi(c.Param("category_id"))
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "无效的分类 ID"})
		return
	}

	// 调用 repository 获取该分类下的所有文章
	posts, err := repositories.GetPostsByCategoryall(categoryID, 0) // 0 表示获取所有文章
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "获取文章失败", "details": err.Error()})
		return
	}

	// 返回文章数据
	c.JSON(http.StatusOK, gin.H{"data": posts})
}

// GetPost 获取单篇文章并增加浏览量
func GetPost(c *gin.Context) {
	// 获取文章 ID
	id, err := strconv.Atoi(c.Param("id"))
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "无效的文章 ID"})
		return
	}

	// 获取文章
	post, err := repositories.GetPostByID(uint(id))
	if err != nil {
		c.JSON(http.StatusNotFound, gin.H{"error": "文章未找到", "details": err.Error()})
		return
	}

	// 增加浏览量
	if err := repositories.UpdatePostMetrics(uint(id), 1, 0, 0); err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "增加浏览量失败", "details": err.Error()})
		return
	}

	// 返回文章数据
	c.JSON(http.StatusOK, gin.H{"data": post})
}

// UpdatePost 更新文章
func UpdatePost(c *gin.Context) {
	// 获取文章 ID
	id, err := strconv.Atoi(c.Param("id"))
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "无效的文章 ID"})
		return
	}

	var post models.Post
	if err := c.ShouldBindJSON(&post); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "无效的请求数据", "details": err.Error()})
		return
	}

	// 设置文章 ID
	post.ID = uint(id)

	// 更新文章
	if err := repositories.UpdatePost(post); err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "更新文章失败", "details": err.Error()})
		return
	}

	c.JSON(http.StatusOK, gin.H{"message": "文章更新成功", "data": post})
}

// DeletePost 删除文章
func DeletePost(c *gin.Context) {
	// 获取文章 ID
	id, err := strconv.Atoi(c.Param("id"))
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "无效的文章 ID"})
		return
	}

	// 删除文章
	if err := repositories.DeletePost(uint(id)); err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "删除文章失败", "details": err.Error()})
		return
	}

	c.JSON(http.StatusOK, gin.H{"message": "文章已删除"})
}
